import fs from "fs";
import path from "path";

const __dirname = import.meta.dirname;

// 1.文件在读取的过程中如果文件不存在会报错
// 2.写入文件的时候 如果文件不存在则会创建这个文件 （如果文件有内容会清空内容 ）
// 3.整个过程非常浪费内存，读取内容的时候需要将内容写到内存中（淹没可用内存，64k以上的文件不建议采用 readFile）
// 4.如果是大文件，readFile无法处理 需要读取部分数据（流）

// 文件的拷贝操作
// fs.readFile(path.resolve(__dirname, "pc.js"), function (err, data) {
//   console.log(data);
//   fs.writeFile(path.resolve(__dirname, "pc-copy.js"), data, () => {
//     console.log("write ok");
//   });
// });
// 同步（性能更好）阻塞主线程 和异步 （事件驱动）不会阻塞
// 代码第一次启动的时候 都会采用同的逻辑， 运行的过程中我们经常采用异步

// 自己打开文件来读取，自己来打开新的文件来写入（这个过程非常麻烦），写完后，关闭文件

const buf = Buffer.alloc(10); // 我希望先读取10个字节

// flag: 标识位 r -> read 如果文件不存在会报错
//             w -> write 如果文件不存在会创建，存在则清空
//             a->  append 追加内容
//             r+  read + write (文件不存在会报错)
//             w+  write + read (文件不存在会创建)
// 0o666 模式  rwx(自己)   rwx（自己的组）   rwx(其他人) 权限组合

// fs.open(path.resolve(__dirname, "pc.js"), "r", function (err, fd) {
//   console.log(fd); // fd -> 就意味着我操作的是 pc.js 而且可以做读取操作

//   // 将读取到的内容写入到这个buf中
//   // 告诉读取的时候 写入到buf的第零个为止，写入10个，从文件的第零个开始读取
//   fs.read(fd, buf, 0, 10, 0, function (err, bytesRead) {
//     // bytesRead真正读取的个数
//     console.log(buf.toString());

//     fs.open(
//       path.resolve(__dirname, "pc-copy.js"),
//       "w",
//       0o666,
//       function (err, wfd) {
//         // 将buffer的第零个位置从0读取出来10个，写入到文件的第零个为止
//         fs.write(wfd, buf, 0, 10, 0, function (err, written) {
//           console.log(written);
//         });
//       }
//     );
//   });
// });

// 问题1.多个操作并发，我们需要再这些操作完成后通知我，在去读和写（发布订阅）
// 问题2.无法控制中间的流程， 读写分离
// fs.open(path.resolve(__dirname, "pc.js"), "r", function (err, fd) {
//   // fd -> 就意味着我操作的是 pc.js 而且可以做读取操作
//   fs.open(
//     path.resolve(__dirname, "pc-copy.js"),
//     "w",
//     0o666,
//     function (err, wfd) {
//       // 将读取到的内容写入到这个buf中
//       // 告诉读取的时候 写入到buf的第零个为止，写入10个，从文件的第零个开始读取
//       let readPosition = 0;
//       let writePosition = 0;
//       function next() {
//         fs.read(
//           fd,
//           buf,
//           0,
//           buf.length,
//           readPosition,
//           function (err, bytesRead) {
//             if (bytesRead) {
//               fs.write(
//                 wfd,
//                 buf,
//                 0,
//                 bytesRead,
//                 writePosition,
//                 function (err, written) {
//                   console.log(written);

//                   readPosition += bytesRead;
//                   writePosition += bytesRead;
//                   next();
//                 }
//               );
//             } else {
//               fs.close(fd, () => {});
//               fs.close(wfd, () => {});
//             }
//           }
//         );
//       }
//       next();
//     }
//   );
// });
